package tt.dz.order.dao;

import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.PreparedStatementCallback;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
/**
 * DAOUtil 数据库通用操作
 * @author NIBO
 *
 */
public class BaseDAOUtil {

	private static NamedParameterJdbcTemplate jdbcTemplate = (NamedParameterJdbcTemplate) SysApplicationContextAware
			.getBean("jdbcTemplate");

	/**
	 * 单个对象保存
	 * @param sql
	 * @param object
	 * @return
	 */
	public static <T> int save(String sql, T object) {
		SqlParameterSource paramSource = new BeanPropertySqlParameterSource(object);
		return jdbcTemplate.update(sql, paramSource);
	}

	/**
	 * 单个对象更新
	 * @param sql
	 * @param object
	 * @return
	 */
	public static <T> int updateObject(String sql, T object) {
		SqlParameterSource paramSource = new BeanPropertySqlParameterSource(object);
		return jdbcTemplate.update(sql, paramSource);
	}

	/**
	 * 对象更新
	 * @param sql
	 * @param paramMap
	 * @return
	 */
	public static int update(String sql, Map<String, ?> paramMap) {
		return jdbcTemplate.update(sql, paramMap);
	}

	/**
	 * 删除
	 * @param sql
	 * @param paramMap
	 * @return
	 */
	public static int delete(String sql, Map<String, ?> paramMap) {
		return jdbcTemplate.update(sql, paramMap);
	}

	/**
	 * 单个对象查询
	 * @param sql
	 * @param params
	 * @param c
	 * @return
	 */
	public static <T> T queryForObject(String sql, Map<String, Object> params, Class<T> c) {
		List<T> list = queryForList(sql, params, c);
		if (list.isEmpty()) {
			return null;
		} else {
			return list.get(0);
		}
	}

	/**
	 * 列表查询
	 * @param sql
	 * @param params
	 * @param c
	 * @return
	 */
	public static <T> List<T> queryForList(String sql, Map<String, Object> params, Class<T> c) {
		RowMapper<T> rw = new BeanPropertyRowMapper<T>(c);
		return jdbcTemplate.query(sql, params, rw);
	}

	/**
	 * 列表查询,返回的每个对象是map
	 * @param sql
	 * @param params
	 * @return
	 */
	public static List<Map<String, Object>> queryForList(String sql, Map<String, Object> params) {
		return jdbcTemplate.queryForList(sql, params);
	}

	/**
	 * 批量更新或保存
	 * @param sql
	 * @param batchValues
	 * @return
	 */
	public static int[] batchUpdate(String sql, Map<String, ?>[] batchValues) {
		return jdbcTemplate.batchUpdate(sql, batchValues);
	}
	/**
	 * 查询int值
	 * @param sql
	 * @param param
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static int queryForInt(String sql, Object param) {
		SqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(param);
		return jdbcTemplate.queryForInt(sql, sqlParameterSource);
	}

	/**
	 * 原生态jdbc
	 * @param sql
	 * @param paramMap
	 * @param action
	 * @return
	 */
	public static <T> T execute(String sql, Map<String, ?> paramMap, PreparedStatementCallback<T> action) {
		return jdbcTemplate.execute(sql, paramMap, action);
	}

}
